package com.smart.community.region.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.smart.community.region.entity.ShopFeeRecord;
import com.smart.community.region.vo.ShopFeeRecordVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 店铺费用记录Mapper接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-09-30
 */
public interface ShopFeeRecordMapper extends BaseMapper<ShopFeeRecord> {
    
    /**
     * 分页查询费用记录
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param paymentStatus 支付状态
     * @return 分页结果
     */
    IPage<ShopFeeRecord> selectFeeRecordPage(Page<ShopFeeRecord> page,
                                              @Param("shopId") Long shopId,
                                              @Param("feeType") String feeType,
                                              @Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 根据店铺ID查询费用记录列表
     * 
     * @param shopId 店铺ID
     * @return 费用记录列表
     */
    List<ShopFeeRecord> selectFeeRecordsByShopId(@Param("shopId") Long shopId);
    
    /**
     * 根据费用类型查询费用记录列表
     * 
     * @param feeType 费用类型
     * @return 费用记录列表
     */
    List<ShopFeeRecord> selectFeeRecordsByType(@Param("feeType") String feeType);
    
    /**
     * 根据支付状态查询费用记录列表
     * 
     * @param paymentStatus 支付状态
     * @return 费用记录列表
     */
    List<ShopFeeRecord> selectFeeRecordsByPaymentStatus(@Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 根据费用期间查询费用记录列表
     * 
     * @param feePeriod 费用期间
     * @return 费用记录列表
     */
    List<ShopFeeRecord> selectFeeRecordsByPeriod(@Param("feePeriod") String feePeriod);
    
    /**
     * 根据日期范围查询费用记录列表
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 费用记录列表
     */
    List<ShopFeeRecord> selectFeeRecordsByDateRange(@Param("startDate") LocalDate startDate,
                                                     @Param("endDate") LocalDate endDate);
    
    /**
     * 根据店铺ID和费用类型查询费用记录列表
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @return 费用记录列表
     */
    List<ShopFeeRecord> selectFeeRecordsByShopIdAndType(@Param("shopId") Long shopId,
                                                         @Param("feeType") String feeType);
    
    /**
     * 统计费用记录数量
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param paymentStatus 支付状态
     * @return 费用记录数量
     */
    Integer countFeeRecords(@Param("shopId") Long shopId, 
                          @Param("feeType") String feeType,
                          @Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 统计费用总金额
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param paymentStatus 支付状态
     * @return 费用总金额
     */
    BigDecimal sumFeeAmount(@Param("shopId") Long shopId, 
                           @Param("feeType") String feeType,
                           @Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 获取费用统计信息
     * 
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 费用统计信息
     */
    Object selectFeeStatistics(@Param("shopId") Long shopId,
                                           @Param("startDate") LocalDate startDate,
                                           @Param("endDate") LocalDate endDate);
    
    /**
     * 分页查询费用记录VO（包含店铺名称）
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 遵循《系统状态枚举权威标准声明.md》状态枚举规范
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param paymentStatus 支付状态
     * @param feeDateStart 费用日期开始
     * @param feeDateEnd 费用日期结束
     * @param dueDateStart 到期日期开始
     * @param dueDateEnd 到期日期结束
     * @return 分页结果
     */
    IPage<ShopFeeRecordVO> selectFeeRecordVOPage(Page<ShopFeeRecordVO> page,
                                                  @Param("shopId") Long shopId,
                                                  @Param("feeType") String feeType,
                                                  @Param("paymentStatus") Integer paymentStatus,
                                                  @Param("feeDateStart") String feeDateStart,
                                                  @Param("feeDateEnd") String feeDateEnd,
                                                  @Param("dueDateStart") String dueDateStart,
                                                  @Param("dueDateEnd") String dueDateEnd);
    
    /**
     * 分页查询费用记录VO（包含店铺名称，支持数据权限过滤）
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 遵循《系统状态枚举权威标准声明.md》状态枚举规范
     * 
     * @param page 分页参数
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param paymentStatus 支付状态
     * @param shopIds 有权限的店铺ID列表
     * @param feeDateStart 费用日期开始
     * @param feeDateEnd 费用日期结束
     * @param dueDateStart 到期日期开始
     * @param dueDateEnd 到期日期结束
     * @return 分页结果
     */
    IPage<ShopFeeRecordVO> selectFeeRecordVOPageWithPermission(Page<ShopFeeRecordVO> page,
                                                                 @Param("shopId") Long shopId,
                                                                 @Param("feeType") String feeType,
                                                                 @Param("paymentStatus") Integer paymentStatus,
                                                                 @Param("shopIds") List<Long> shopIds,
                                                                 @Param("feeDateStart") String feeDateStart,
                                                                 @Param("feeDateEnd") String feeDateEnd,
                                                                 @Param("dueDateStart") String dueDateStart,
                                                                 @Param("dueDateEnd") String dueDateEnd);
    
    /**
     * 根据ID获取费用记录详情VO
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 
     * @param id 费用记录ID
     * @return 费用记录详情VO
     */
    ShopFeeRecordVO selectFeeRecordDetail(@Param("id") Long id);
    
    /**
     * 获取费用统计信息
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param paymentStatus 支付状态
     * @return 统计信息
     */
    java.util.Map<String, Object> getFeeStatistics(@Param("shopId") Long shopId,
                                                   @Param("feeType") String feeType,
                                                   @Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 根据店铺ID列表获取费用统计信息
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 
     * @param shopIds 店铺ID列表
     * @param feeType 费用类型
     * @param paymentStatus 支付状态
     * @return 统计信息
     */
    java.util.Map<String, Object> getFeeStatisticsByShopIds(@Param("shopIds") List<Long> shopIds,
                                                             @Param("feeType") String feeType,
                                                             @Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 查询费用记录VO列表
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 
     * @param shopId 店铺ID
     * @param feeType 费用类型
     * @param paymentStatus 支付状态
     * @return 费用记录VO列表
     */
    List<ShopFeeRecordVO> selectFeeRecordVOList(@Param("shopId") Long shopId,
                                                 @Param("feeType") String feeType,
                                                 @Param("paymentStatus") Integer paymentStatus);
    
    /**
     * 根据店铺ID列表查询费用记录VO列表
     * 遵循《Java后端SpringBoot代码开发规范_重构版.md》Mapper层规范
     * 
     * @param shopIds 店铺ID列表
     * @param feeType 费用类型
     * @param paymentStatus 支付状态
     * @return 费用记录VO列表
     */
    List<ShopFeeRecordVO> selectFeeRecordVOListByShopIds(@Param("shopIds") List<Long> shopIds,
                                                         @Param("feeType") String feeType,
                                                         @Param("paymentStatus") Integer paymentStatus);
}
